home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 21 / Cream of the Crop 21 (Terry Blount) (October 1996).iso / os2 / e33el2.zip / emacs / 19.33 / lisp / cmuscheme.el < prev    next >
Lisp/Scheme  |  1996-01-20  |  17KB  |  414 lines

  1. ;;; cmuscheme.el --- Scheme process in a buffer. Adapted from tea.el.
  2.  
  3. ;; Copyright (C) 1988, 1994 Free Software Foundation, Inc.
  4.  
  5. ;; Author: Olin Shivers <olin.shivers@cs.cmu.edu>
  6. ;; Maintainer: FSF
  7. ;; Keywords: processes, lisp
  8.  
  9. ;; This file is part of GNU Emacs.
  10.  
  11. ;; GNU Emacs is free software; you can redistribute it and/or modify
  12. ;; it under the terms of the GNU General Public License as published by
  13. ;; the Free Software Foundation; either version 2, or (at your option)
  14. ;; any later version.
  15.  
  16. ;; GNU Emacs is distributed in the hope that it will be useful,
  17. ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
  18. ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  19. ;; GNU General Public License for more details.
  20.  
  21. ;; You should have received a copy of the GNU General Public License
  22. ;; along with GNU Emacs; see the file COPYING.  If not, write to the
  23. ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  24. ;; Boston, MA 02111-1307, USA.
  25.  
  26. ;;; Commentary:
  27.  
  28. ;;    This is a customisation of comint-mode (see comint.el)
  29. ;;
  30. ;; Written by Olin Shivers (olin.shivers@cs.cmu.edu). With bits and pieces
  31. ;; lifted from scheme.el, shell.el, clisp.el, newclisp.el, cobol.el, et al..
  32. ;; 8/88
  33. ;;
  34. ;; Please send me bug reports, bug fixes, and extensions, so that I can
  35. ;; merge them into the master source.
  36. ;;
  37. ;; The changelog is at the end of this file.
  38. ;;
  39. ;; NOTE: MIT Cscheme, when invoked with the -emacs flag, has a special user
  40. ;; interface that communicates process state back to the superior emacs by
  41. ;; outputting special control sequences. The gnumacs package, xscheme.el, has
  42. ;; lots and lots of special purpose code to read these control sequences, and
  43. ;; so is very tightly integrated with the cscheme process. The cscheme
  44. ;; interrupt handler and debugger read single character commands in cbreak
  45. ;; mode; when this happens, xscheme.el switches to special keymaps that bind
  46. ;; the single letter command keys to emacs functions that directly send the
  47. ;; character to the scheme process.  Cmuscheme mode does *not* provide this
  48. ;; functionality. If you are a cscheme user, you may prefer to use the
  49. ;; xscheme.el/cscheme -emacs interaction.
  50. ;; 
  51. ;; Here's a summary of the pros and cons, as I see them.
  52. ;; xscheme: Tightly integrated with inferior cscheme process!  A few commands
  53. ;;         not in cmuscheme. But. Integration is a bit of a hack.  Input
  54. ;;         history only keeps the immediately prior input. Bizarre
  55. ;;         keybindings.
  56. ;; 
  57. ;; cmuscheme: Not tightly integrated with inferior cscheme process.  But.
  58. ;;            Carefully integrated functionality with the entire suite of
  59. ;;            comint-derived CMU process modes. Keybindings reminiscent of
  60. ;;            Zwei and Hemlock. Good input history. A few commands not in
  61. ;;            xscheme.
  62. ;;  
  63. ;; It's a tradeoff. Pay your money; take your choice. If you use a Scheme
  64. ;; that isn't Cscheme, of course, there isn't a choice. Xscheme.el is *very*
  65. ;; Cscheme-specific; you must use cmuscheme.el.  Interested parties are
  66. ;; invited to port xscheme functionality on top of comint mode...
  67.  
  68. ;;; Code:
  69.  
  70. (require 'scheme)
  71. (require 'comint)
  72.  
  73. ;;; INFERIOR SCHEME MODE STUFF
  74. ;;;============================================================================
  75.  
  76. (defvar inferior-scheme-mode-hook nil
  77.   "*Hook for customising inferior-scheme mode.")
  78. (defvar inferior-scheme-mode-map nil)
  79.  
  80. (cond ((not inferior-scheme-mode-map)
  81.        (setq inferior-scheme-mode-map
  82.          (copy-keymap comint-mode-map))
  83.        (define-key inferior-scheme-mode-map "\M-\C-x" ;gnu convention
  84.                'scheme-send-definition)
  85.        (define-key inferior-scheme-mode-map "\C-x\C-e" 'scheme-send-last-sexp)
  86.        (define-key inferior-scheme-mode-map "\C-c\C-l" 'scheme-load-file)
  87.        (define-key inferior-scheme-mode-map "\C-c\C-k" 'scheme-compile-file)
  88.        (scheme-mode-commands inferior-scheme-mode-map))) 
  89.  
  90. ;; Install the process communication commands in the scheme-mode keymap.
  91. (define-key scheme-mode-map "\M-\C-x" 'scheme-send-definition);gnu convention
  92. (define-key scheme-mode-map "\C-x\C-e" 'scheme-send-last-sexp);gnu convention
  93. (define-key scheme-mode-map "\C-c\C-e" 'scheme-send-definition)
  94. (define-key scheme-mode-map "\C-c\M-e" 'scheme-send-definition-and-go)
  95. (define-key scheme-mode-map "\C-c\C-r" 'scheme-send-region)
  96. (define-key scheme-mode-map "\C-c\M-r" 'scheme-send-region-and-go)
  97. (define-key scheme-mode-map "\C-c\M-c" 'scheme-compile-definition)
  98. (define-key scheme-mode-map "\C-c\C-c" 'scheme-compile-definition-and-go)
  99. (define-key scheme-mode-map "\C-c\C-z" 'switch-to-scheme)
  100. (define-key scheme-mode-map "\C-c\C-l" 'scheme-load-file)
  101. (define-key scheme-mode-map "\C-c\C-k" 'scheme-compile-file) ;k for "kompile"
  102.  
  103. (defvar scheme-buffer)
  104.  
  105. (defun inferior-scheme-mode ()
  106.   "Major mode for interacting with an inferior Scheme process.
  107.  
  108. The following commands are available:
  109. \\{inferior-scheme-mode-map}
  110.  
  111. A Scheme process can be fired up with M-x run-scheme.
  112.  
  113. Customisation: Entry to this mode runs the hooks on comint-mode-hook and
  114. inferior-scheme-mode-hook (in that order).
  115.  
  116. You can send text to the inferior Scheme process from other buffers containing
  117. Scheme source.  
  118.     switch-to-scheme switches the current buffer to the Scheme process buffer.
  119.     scheme-send-definition sends the current definition to the Scheme process.
  120.     scheme-compile-definition compiles the current definition.
  121.     scheme-send-region sends the current region to the Scheme process.
  122.     scheme-compile-region compiles the current region.
  123.  
  124.     scheme-send-definition-and-go, scheme-compile-definition-and-go,
  125.         scheme-send-region-and-go, and scheme-compile-region-and-go
  126.         switch to the Scheme process buffer after sending their text.
  127. For information on running multiple processes in multiple buffers, see
  128. documentation for variable scheme-buffer.
  129.  
  130. Commands:
  131. Return after the end of the process' output sends the text from the 
  132.     end of process to point.
  133. Return before the end of the process' output copies the sexp ending at point
  134.     to the end of the process' output, and sends it.
  135. Delete converts tabs to spaces as it moves back.
  136. Tab indents for Scheme; with argument, shifts rest
  137.     of expression rigidly with the current line.
  138. C-M-q does Tab on each line starting within following expression.
  139. Paragraphs are separated only by blank lines.  Semicolons start comments.
  140. If you accidentally suspend your process, use \\[comint-continue-subjob]
  141. to continue it."
  142.   (interactive)
  143.   (comint-mode)
  144.   ;; Customise in inferior-scheme-mode-hook
  145.   (setq comint-prompt-regexp "^[^>\n]*>+ *") ; OK for cscheme, oaklisp, T,...
  146.   (scheme-mode-variables)
  147.   (setq major-mode 'inferior-scheme-mode)
  148.   (setq mode-name "Inferior Scheme")
  149.   (setq mode-line-process '(":%s"))
  150.   (use-local-map inferior-scheme-mode-map)
  151.   (setq comint-input-filter (function scheme-input-filter))
  152.   (setq comint-get-old-input (function scheme-get-old-input))
  153.   (run-hooks 'inferior-scheme-mode-hook))
  154.  
  155. (defvar inferior-scheme-filter-regexp "\\`\\s *\\S ?\\S ?\\s *\\'"
  156.   "*Input matching this regexp are not saved on the history list.
  157. Defaults to a regexp ignoring all inputs of 0, 1, or 2 letters.")
  158.  
  159. (defun scheme-input-filter (str)
  160.   "Don't save anything matching inferior-scheme-filter-regexp"
  161.   (not (string-match inferior-scheme-filter-regexp str)))
  162.  
  163. (defun scheme-get-old-input ()
  164.   "Snarf the sexp ending at point"
  165.   (save-excursion
  166.     (let ((end (point)))
  167.       (backward-sexp)
  168.       (buffer-substring (point) end))))
  169.  
  170. (defun scheme-args-to-list (string)
  171.   (let ((where (string-match "[ \t]" string)))
  172.     (cond ((null where) (list string))
  173.       ((not (= where 0))
  174.        (cons (substring string 0 where)
  175.          (scheme-args-to-list (substring string (+ 1 where)
  176.                          (length string)))))
  177.       (t (let ((pos (string-match "[^ \t]" string)))
  178.            (if (null pos)
  179.            nil
  180.          (scheme-args-to-list (substring string pos
  181.                          (length string)))))))))
  182.  
  183. (defvar scheme-program-name "scheme"
  184.   "*Program invoked by the run-scheme command")
  185.  
  186. ;;;###autoload